<template>
  <h1>watch及watchEffect知识点</h1>
  <div class='page-container'>watch监听:一共可以接受三个参数，侦听数据源、回调函数和配置选项(deep:true,immadiate:true) </div>
  <address>其中监听数据源可以是ref 和reactive定义的响应式数据.也可是计算属性<br />
    但是如果是监听的reactive的一个具体属性值的变换,是不行的,需要变为箭头函数的形式进行监听<br />
    watch和watchEffect函数的返回值是一个取消监听的函数<br />
    watch 支持拿到新值和旧值 watchEffect不行
  </address>
  <button @click="changeX">修改X</button>
  <button @click="handleUnwatch">取消监听</button>
  <h2>watchEffect</h2>
  <address>watchEffect不需要写监听的数据源.只有两个参数,直接写回调函数.会自动收集回调函数中的响应式数据.在发生改变时候触发.<br />
    默认自带inmmadiate:true 自动先执行一次

    <a class="bluea" href="https://blog.csdn.net/Robinwang1128/article/details/140206849" target="_blank"> 参考博客</a>
  </address>
  <a class="bluea" href="https://blog.csdn.net/qq_44741577/article/details/136967877" target="_blank">具体详见 </a>

  <h2>按钮权限控制</h2>
  <el-button v-showButton="'study:watch:search'">查询按钮</el-button> {{ doubleX }}
  <el-button v-showButton="'study:watch:delete'">删除按钮</el-button>
</template>
<script setup>
const x = ref(1)
const y = ref(1)
const doubleX = computed(() => x.value * 2)// 当你计算属性依赖项的值发生了变换.计算属性重新计算.不发生变换走缓存
const obj = reactive({ count: 0 })

const changeX = () => {
  // y.value++         //ref响应式.computed依赖这个响应数据,都能被监听到
  obj.count++

}


// 单个 ref
watch(x, (newValue) => {
  console.log(`x is ${newValue}`)
})

// 计算属性
watch(doubleX, (newValue) => {
  console.log(`doubleX is ${newValue}`)
})

// getter 函数
watch(
  () => x.value + y.value,
  (sum) => {
    console.log(`sum of x + y is: ${sum}`)
  }
)

// 响应式对象
// const unwatch = watch(() => obj.count, (newValue, oldValue) => {
//   // 在嵌套的属性变更时触发
//   // 注意：`newValue` 此处和 `oldValue` 是相等的
//   // 因为它们是同一个对象！
//   console.log(`你能监听reactive111对象?`)
// })




// 以上类型的值组成的数组
watch([x, () => y.value], ([newX, newY]) => {
  console.log(`x is ${newX} and y is ${newY}`)
})

const unwatch = watchEffect(() => {
  obj.count
  console.log(`你能监听reactive对象?`)
},)
// 取消监听
const handleUnwatch = function () {
  unwatch()
}
</script>
<style lang='scss' scoped>
.page-container {}
</style>